<?php

namespace app\payment\admin;

use app\common\builder\ZBuilder;
use app\payment\model\Userblacklist as UserblacklistModel;
use app\payment\model\App as AppModel;
use app\payment\model\PaymentPayCompany as PaymentPayCompanyModel;

/**
 * 用户黑名单控制器
 */
class Userblacklist extends Index
{

    protected function initialize()
    {
        parent::initialize();
        if (!in_array(request()->action(), ['index', 'see'])) {
            if ($this->no_auth) {
                $this->error('权限不足！');
            }
        }
    }

    /**
     * 首页
     * @return mixed
     */
    public function index()
    {
        // 设置搜索参数
        $search = ['merchant_id' => '商户号', 'user_id' => '用户ID', 'app_id' => '应用ID', 'status' => '状态'];

        // 获取查询条件
        $map = $this->getMap();

        if ($this->no_auth) {
            $map[] = ['merchant_id', '=', $this->merchant_id];
            unset($search['merchant_id']);
        }

        $list_rows = input('list_rows', 20) >= 20 ? 20 : input('list_rows');
        // 数据列表
        $data_list = UserblacklistModel::where($map)->order('id desc')->paginate($list_rows);
        // 分页数据
        $page = $data_list->render();

        $status_type = $this->role > $this->have_auth ? 'status' : 'switch';

        // 所有的支付类型
        $all_payment_type = pay_config('payment_type');

        // 支付公司
        $payment_company = PaymentPayCompanyModel::where([])->order(['group' => 'asc', 'sort' => 'asc', 'title' => 'asc', 'name' => 'asc'])->column('title', 'name');

        $items = [
            ['id', 'ID'],
            ['merchant_id', '商户', 'callback', function ($value) {
                return $value . '<br/>' . get_user_nickname($value);
            }, '', 'text-center'],
            ['user_id', '用户ID'],
            ['app_id', '应用名称', 'callback', function ($value) {
                return $value ? $value . '<br/>' . UserblacklistModel::appName($value) : '';
            }, '', 'text-center'],
            ['operation_id', '操作', 'callback', function ($value) {
                return $value . '<br/>' . get_user_nickname($value);
            }, '', 'text-center'],
            ['payment_type', '禁用支付类型', 'callback', function ($payment_type, $all_payment_type) {

                $payment_type_string = '';
                $payment_type = json_decode($payment_type, true);
                if ($payment_type) {
                    foreach ($payment_type as $value) {
                        $arr[] = $all_payment_type[$value];
                    }
                    $payment_type_string = implode('<br/>', $arr);
                }

                return $payment_type_string; // 可以用$data接收到其他字段的数据
            }, $all_payment_type],
            ['type_company_config', '绑定支付公司', 'callback', function ($type_company_config, $payment_company) {

                $payment_type_string = '';
                $type_company_config = json_decode($type_company_config, true);
                if ($type_company_config) {
                    foreach ($type_company_config as $value) {
                        $arr[] = $payment_company[$value];
                    }
                    $payment_type_string = implode('<br/>', $arr);
                }

                return $payment_type_string; // 可以用$data接收到其他字段的数据
            }, $payment_company],
            ['remark', '备注'],
            ['status', '状态', $status_type],
            ['create_time', '创建时间', 'datetime', '', 'Y-m-d H:i:s'],
            ['right_button', '操作', 'btn']
        ];

        $tips = '用户黑名单，不允许创建订单！';
        // 使用ZBuilder快速创建数据表格
        return ZBuilder::make('table')
            ->setPageTitle($tips) // 设置页面标题
            ->setTableName('payment_user_blacklist') // 设置数据表名
            ->setPrimaryKey('id') // 设置主键名为id
            ->setSearch($search) // 设置搜索参数
            ->addColumns($items)
            ->addTopButtons('add,enable,disable,delete') // 批量添加顶部按钮
            ->addRightButton('see', ['title' => '查看', 'icon' => 'fa fa-fw fa-eye', 'href' => url('see', ['id' => '__id__'])], true)
            ->addRightButtons('edit') // 批量添加右侧按钮
            ->setRowList($data_list) // 设置表格数据
            ->setPages($page) // 设置分页数据
            ->fetch(); // 渲染页面
    }

    /**
     * 新增
     * @return mixed
     */
    public function add()
    {
        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }

            unset($data['trade_pwd']);

            if ($this->no_auth) {
                $data['merchant_id'] = $this->merchant_id;
            }

            // 验证
            $result = $this->validate($data, 'Userblacklist');
            // 验证失败 输出错误信息
            if (true !== $result) {
                $this->error($result);
            }

            // 支付类型
            if (isset($data['payment_type'])) {
                $data['payment_type'] = json_encode($data['payment_type']);
            }

            // 支付类型和支付公司配置
            if (isset($data['type_company_config'])) {
                $data['type_company_config'] = json_encode($data['type_company_config']);
            }

            $info = UserblacklistModel::where('merchant_id', $data['merchant_id'])
                ->where('user_id', $data['user_id'])
                ->where('app_id', $data['app_id'])
                ->find();
            if ($info) {
                $this->error("请刷新，数据已经存在！");
            }

            if ($data['app_id'] != 0) {
                $info = AppModel::where('merchant_id', $data['merchant_id'])
                    ->where('id', $data['app_id'])
                    ->find();
                if (!$info) {
                    $this->error("应用ID不存在！");
                }
            }

            $data['operation_id'] = $this->merchant_id;
            if ($temp = UserblacklistModel::create($data)) {
                // 记录行为
                action_log('payment_user_blacklist_add', 'payment_user_blacklist', $temp['id'], UID, json_encode($temp));
                $this->success('新增成功', url('index'));
            } else {
                $this->error('新增失败');
            }
        }

        $ls[] = ['status', '=', 1];
        $ls[] = ['payment_type', 'like', '%' . 'alipay_h5' . '%'];

        $payment_company = PaymentPayCompanyModel::where($ls)->order(['group' => 'asc', 'sort' => 'asc', 'title' => 'asc', 'name' => 'asc'])->column('title', 'name');

        $items = [
            ['select', 'merchant_id', '商户号', '', all_merchant()],
            ['text', 'user_id', '用户ID', ''],
            ['text', 'app_id', '应用ID', '', 0],
            ['checkbox', 'payment_type', '支付类型', '请选择禁用支付类型', pay_config('payment_type')],
            ['sortcheckbox', 'type_company_config', '绑定支付公司', '绑定支付公司', $payment_company],
            ['textarea', 'remark', '备注', '<code>操作理由</code>'],
            ['radio', 'mode', '模式', '开启后当禁用微信h5支付，选择支付宝h5支付', ['禁用', '启用'], 0],
            ['radio', 'pay_polling_open', '支付公司轮循设置', '开启后,选择的支付公司中随机轮循', ['关闭', '开启'], 1],
            ['radio', 'status', '状态', '', ['禁用', '启用'], 1],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];
        if ($this->no_auth) {
            unset($items[0]);
        }

        $tips = '用户黑名单，不允许创建订单！';

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('新增') // 设置页面标题
            ->setPageTips($tips)
            ->addFormItems($items)
            ->fetch();
    }

    /**
     * 编辑
     * @param null $id 
     * @return mixed
     */
    public function edit($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }

        // 保存数据
        if ($this->request->isPost()) {
            $data = $this->request->post();

            if ($this->merchant_info['trade_pwd'] != md5(md5(md5($data['trade_pwd'])))) {
                $this->error('交易密码不正确！');
            }
            unset($data['trade_pwd']);

            if ($this->no_auth) {
                $data['merchant_id'] = $this->merchant_id;
            }
            // 验证
            $result = $this->validate($data, 'Userblacklist');
            $data['operation_id'] = $this->merchant_id;
            // 验证失败 输出错误信息
            if (true !== $result) {
                $this->error($result);
            }

            // 支付类型
            if (isset($data['payment_types'])) {
                $data['payment_type'] = json_encode($data['payment_types']);
            } else {
                $data['payment_type'] = '';
            }

            // 支付类型和支付公司配置
            if (isset($data['type_company_configs'])) {
                $data['type_company_config'] = json_encode($data['type_company_configs']);
            } else {
                $data['type_company_config'] = '';
            }

            if (UserblacklistModel::update($data)) {
                $temp = UserblacklistModel::where(['id' => $data['id']])->find();
                // 记录行为
                action_log('payment_user_blacklist_edit', 'payment_user_blacklist', $temp['id'], UID, json_encode($temp));
                $this->success('编辑成功', url('index'));
            } else {
                $this->error('编辑失败');
            }
        }

        // 获取数据
        $info = UserblacklistModel::where('id', $id)->find();
        if (!$info) {
            $this->error('不存在！');
        }

        if ($this->no_auth) {
            if ($this->merchant_id != $info['merchant_id']) {
                $this->error('参数错误！');
            }
        }

        $ls[] = ['status', '=', 1];
        $ls[] = ['payment_type', 'like', '%' . 'alipay_h5' . '%'];

        $payment_company = PaymentPayCompanyModel::where($ls)->order(['group' => 'asc', 'sort' => 'asc', 'title' => 'asc', 'name' => 'asc'])->column('title', 'name');

        $type_company_config_array = json_decode($info['type_company_config'], true);
        $pay_company_select = [];
        if ($type_company_config_array) {
            foreach ($type_company_config_array as $value) {
                // 修改的时候，记录上次选择的代付公司
                $pay_company_select[$value] = isset($payment_company[$value]) ? $payment_company[$value] : PaymentPayCompanyModel::where(['name' => $value])->value('title');
            }
        }

        $array_diff = array_diff($payment_company, $pay_company_select);
        $select = $pay_company_select + $array_diff;

        $items = [
            ['hidden', 'id', $id],
            ['select', 'merchant_id', '商户号', '', all_merchant()],
            ['text', 'user_id', '用户ID', ''],
            ['text', 'app_id', '应用ID', '', 0],
            ['checkbox', 'payment_types', '支付类型', '请选择支付类型', pay_config('payment_type'), json_decode($info['payment_type'], true)],
            [
                'sortcheckbox',
                'type_company_configs', //name值
                '绑定支付公司', //标题
                "绑定支付公司选择排序结果<code>（可以拖拽排序和取消选择）</code>", //提示
                $select, //数据项
                empty($type_company_config_array) ? '' : array_keys($pay_company_select), //默认值
            ],
            ['textarea', 'remark', '备注', '<code>操作理由</code>'],
            ['radio', 'mode', '模式', '开启后当禁用微信h5支付，选择支付宝h5支付', ['禁用', '启用'], 0],
            ['radio', 'pay_polling_open', '支付公司轮循设置', '开启后,选择的支付公司中随机轮循', ['关闭', '开启'], 1],
            ['radio', 'status', '状态', '', ['禁用', '启用'], 1],
            ['password', 'trade_pwd', '交易密码', '6-16位'],
        ];
        if ($this->no_auth) {
            unset($items[1]);
        }

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('编辑') // 设置页面标题
            ->addFormItems($items)
            ->setFormData($info) // 设置表单数据
            ->fetch();
    }

    /**
     * 查看
     * @param null $id 
     * @return mixed
     */
    public function see($id = null)
    {
        if ($id === null) {
            $this->error('缺少参数！');
        }

        // 获取数据
        $info = UserblacklistModel::where('id', $id)->find();
        if (!$info) {
            $this->error('不存在！');
        }

        if ($this->no_auth) {
            if ($this->merchant_id != $info['merchant_id']) {
                $this->error('参数错误！');
            }
        }

        $ls[] = ['status', '=', 1];
        $ls[] = ['payment_type', 'like', '%' . 'alipay_h5' . '%'];

        $payment_company = PaymentPayCompanyModel::where($ls)->order(['group' => 'asc', 'sort' => 'asc', 'title' => 'asc', 'name' => 'asc'])->column('title', 'name');

        $type_company_config_array = json_decode($info['type_company_config'], true);
        $pay_company_select = [];
        if ($type_company_config_array) {
            foreach ($type_company_config_array as $value) {
                // 修改的时候，记录上次选择的代付公司
                $pay_company_select[$value] = isset($payment_company[$value]) ? $payment_company[$value] : PaymentPayCompanyModel::where(['name' => $value])->value('title');
            }
        }

        $array_diff = array_diff($payment_company, $pay_company_select);
        $select = $pay_company_select + $array_diff;

        $items = [
            ['hidden', 'id', $id],
            ['static', 'merchant_id', '商户号', '商户名称：' . get_user_nickname($info['merchant_id'])],
            ['static', 'user_id', '用户ID', ''],
            ['static', 'app_id', '应用ID', '', 0],
            ['checkbox', 'payment_types', '支付类型', '请选择支付类型', pay_config('payment_type'), json_decode($info['payment_type'], true)],
            [
                'sortcheckbox',
                'type_company_configs', //name值
                '绑定支付公司', //标题
                "绑定支付公司选择排序结果<code>（可以拖拽排序和取消选择）</code>", //提示
                $select, //数据项
                empty($type_company_config_array) ? '' : array_keys($pay_company_select), //默认值
            ],
            ['textarea', 'remark', '备注[:无]', '操作理由', '', 'disabled', ''],
            ['radio', 'mode', '模式', '开启后当禁用微信h5支付，选择支付宝h5支付', ['禁用', '启用'], '', '', 'disabled', ''],
            ['radio', 'pay_polling_open', '支付公司轮循设置', '开启后,选择的支付公司中随机轮循', ['关闭', '开启'], '', '', 'disabled', ''],
            ['radio', 'status', '状态', '', ['禁用', '启用'], '', '', 'disabled', ''],
        ];
        if ($this->no_auth) {
            unset($items[1]);
        }

        // 使用ZBuilder快速创建表单
        return ZBuilder::make('form')
            ->setPageTitle('编辑') // 设置页面标题
            ->addFormItems($items)
            ->hideBtn('submit')
            ->setFormData($info) // 设置表单数据
            ->fetch();
    }

    /**
     * 清空 
     */
    public function clear()
    {
        UserblacklistModel::where('create_time', '>', 0)->delete();
        $this->success('清空完成！');
    }

    /**
     * 删除
     * @param array $record 
     * @return mixed
     */
    public function delete($record = [])
    {
        return $this->setStatus('delete');
    }

    /**
     * 启用
     * @param array $record 
     * @return mixed
     */
    public function enable($record = [])
    {
        return $this->setStatus('enable');
    }

    /**
     * 禁用
     * @param array $record 
     * @return mixed
     */
    public function disable($record = [])
    {
        return $this->setStatus('disable');
    }

    /**
     * 设置状态：删除、禁用、启用
     * @param string $type 类型：delete/enable/disable
     * @param array $record 
     * @return mixed
     */
    public function setStatus($type = '', $record = [])
    {
        $ids = $this->request->isPost() ? input('post.ids/a') : input('param.ids');
        $ids_delete = is_array($ids) ? '' : $ids;
        $data = UserblacklistModel::where('id', 'in', $ids)->column('id');
        return parent::setStatus($type, ['payment_user_blacklist_' . $type, 'payment_user_blacklist', $ids_delete, UID, implode('、', $data)]);
    }

    /**
     * 快速编辑
     * @param array $record 行为日志
     * @return mixed
     */
    public function quickEdit($record = [])
    {
        $id = input('post.pk', '');
        $field = input('post.name', '');
        $value = input('post.value', '');
        $data = UserblacklistModel::where('id', $id)->value($field);
        $details = '字段(' . $field . ')，原值(' . $data . ')，新值：(' . $value . ')';
        return parent::quickEdit(['payment_user_blacklist_edit', 'payment_user_blacklist', $id, UID, $details]);
    }
}
